package handler.annotation;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

/*
 * @Controller注解标识一个类作为“控制器”（例如Web控制器）
 * 通常与@RequestMapping注解的注解处理程序方法结合使用
 * 此注解用作一个@Component，允许通过类路径扫描自动检测实现类
 */
@Controller
@RequestMapping("/a")
public class RequestMappingHandlerA {
    /*
     * @RequestMapping是用于使用灵活方法签名将Web请求映射到请求处理类中的方法的注解
     * 此注解可以在类和方法级别使用。在大多数情况下，在方法级别还可以使用HTTP方法的特定变体之一：
     * @GetMapping、@PostMapping、@PutMapping、@DeleteMapping，或@PatchMapping
     * 使用控制器接口（例如用于AOP代理）时，请确保将所有映射注解（如@RequestMapping和@SessionAttributes）
     * 始终一致地放在控制器接口上，而不是在实现类上
     * 未指定@RequestMapping参数的情况下，字符串参数值等价于path属性的值
     */
    @RequestMapping(path = "/mapping-1")
    public ModelAndView method1() {
        ModelAndView modelAndView = new ModelAndView("first");
        return modelAndView.addObject("message1", "映射1");
    }

    /** 请求重定向（之前的请求将失效） */
    @RequestMapping(value = "/mapping/2")
    public ModelAndView method2() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message2", "映射2");
        /**
         * 设置视图名称时，如果以“redirect:”开头，那么请求将被重定向至另一位置
         * “redirect:/path”表示绝对路径，“redirect:path”表示相对路径
         * 已在模型中添加的属性将作为新的重定向请求的参数
         */
        modelAndView.setViewName("redirect:../mapping-1");
        return modelAndView;
    }

    /** 请求转发（之前的请求仍生效） */
    @RequestMapping(value = "/mapping_3")
    public ModelAndView method3() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message2", "映射3");
        /**
         * 设置视图名称时，如果以“forward:”开头，那么请求将被转发至另一位置
         * “forward:/path”表示绝对路径，“forward:path”表示相对路径
         */
        modelAndView.setViewName("forward:/a/mapping-1");
        return modelAndView;
    }
}
